package c09泛型;

import java.util.*;

/**
 * 擦除：泛型对象传给不带泛型对象时丢失尖括号里的类型信息。
 * 转换：不带泛型的对象传给带泛型的对象，称为未经检查的转换。
 *
 * @author 炜sama
 */
class Apple<T extends Number> {
	T size;

	public Apple(T size) {
		this.size = size;
	}

	public T getSize() {
		return this.size;
	}
}

public class 擦除与转换 {
	public static void main(String[] args) {
		//擦除
		Apple<Integer> a = new Apple<>(6); //确定T为Integer
		//a的getSize方法返回Integer对象
		Integer as = a.getSize();
		//把a对象赋给Apple变量，丢失尖括号里的类型信息
		Apple b = a;
		//b只知道size的类型是上限Number
		Number size1 = b.getSize();
		//但是不知道具体是Number的哪个子类，所以下面代码引起编译错误
//		Integer size2 = b.getSize();

		//转换
		List<Integer> li = new ArrayList<>();
		li.add(6);
		li.add(9);
		List list = li;
		//下面代码引起“未经检查的转换”的警告，编译、运行时完全正常
		List<String> ls = list;     //①
		//但只要访问ls里的元素，如下面代码将引起运行时异常。
		System.err.println(ls.get(0));
	}
}

